1、首先需要创建快照库

1
2
mkdir /mnt/es_repo
chown -R es:es /mnt/es_repo

2、修改 config/elasticsearch.yml ,配置 path.repo 属性

1
path.repo: /mnt/es_repo

3、启动 Elasticsearch 服务

4、创建共享文件存储库

1
2
3
4
5
6
7
8
9
curl -X PUT 'http://20.5.2.68:9201/_snapshot/my_backup' \
--header 'Content-Type: application/json' \
--data-raw '{
"type": "fs",
"settings": {
"location": "/mnt/es_repo",
"compress": "true" // 快照文件的压缩。压缩仅应用于元数据文件( mapping 和 setting )。数据文件不压缩。
}
}'

5、创建快照

一个存储库可以包含同一个集群的多个快照。快照由集群内的唯一名称标识。可以通过执行以下命令在存储库 my_backup 中创建名为 snapshot_1 的快照:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
curl -X PUT 'http://20.5.2.68:9201/_snapshot/my_backup/snapshot_1?wait_for_completion=true'
{
"indices": "index_1,index_2", // 选填,不填的话,则创建所有已打开的索引快照
"ignore_unavailable": true, // 选填,将其设置为 true 将导致在快照创建期间忽略不存在的索引。默认为false,缺少索引时,快照请求将失败。
"include_global_state": true // 选填,false,可以防止将集群全局状态(例如:索引模板等)存储为快照的一部分,默认为false
}
# wait_for_completion: 等待快照完成。默认为false,不等待。

# 返回结果,快照的基本信息
{
"snapshot": {
"snapshot": "snapshot_1",
"uuid": "-H7CDudvR7yx6BZIvnJ8Ow",
"version_id": 5061699,
"version": "5.6.16",
"indices": [
"es_json_test",
"events-history-ceshi_sx_6-1123111",
"acilu"
],
"state": "SUCCESS",
"start_time": "2021-07-01T02:28:57.739Z",
"start_time_in_millis": 1625106537739,
"end_time": "2021-07-01T02:29:01.255Z",
"end_time_in_millis": 1625106541255,
"duration_in_millis": 3516,
"failures": [],
"shards": {
"total": 11,
"failed": 0,
"successful": 11
}
}
}

除了快照每个索引的数据之外,快照过程中还可以存储集群元数据,其中包括持久的集群 settings 和 templates 。

6、监控快照进度

wait_for_completion 标记提供了一个监控的基础形式,但当快照的数据量过大时,最好让 wait_for_completion=false,让其在后台进行快照。

我们可以通过 API 来监控快照的进度:

1
GET   http://20.5.2.68:9201/_snapshot/my_backup/snapshot_1

快照的状态分为以下几种:

  • IN_PROGRESS:快照当前正在运行。
  • SUCCESS:快照完成,所有分片存储成功
  • PARTIAL:全局集群状态已存储,但至少有一个分片的数据未成功存储。在这种情况下,失败部分应包含有关未正确处理的分片的更多详细信息。
  • INCOMPATIBLE:快照是使用旧版本的 elasticsearch 创建的,因此与当前版本的集群不兼容。
  • FAILED:快照完成时出现错误并且无法存储任何数据。

如果要获取有关快照的更直接和完整的信息,可以调用如下请求:

1
GET    http://20.5.2.68:9201/_snapshot/my_backup/snapshot_1/_status

7、查看快照信息

1)查看快照列表信息

1
curl -X GET 'http://20.5.2.68:9201/_snapshot/my_backup/*'

2)查看某快照信息

1
2
3
curl -X GET 'http://20.5.2.68:9201/_snapshot/my_backup/snapshot_1'

# 返回结果与创建快照后的返回信息相同

==索引快照过程是增量的==。在制作索引快照的过程中,Elasticsearch 会分析存储在存储库中的索引文件列表,并仅复制自上次快照以来创建或更改的文件。

如果某些快照不可用,该命令将失败。布尔参数 ignore_unavailable 可用于返回当前可用的所有快照。

8、快照恢复

默认情况下,快照中的所有索引都会被恢复,集群状态不会被恢复。可以通过在 body 请求中使用 indices 和 include_global_state 参数来选择应该恢复的索引以及允许恢复全局集群状态。

可以在正常运行的集群上执行恢复操作。但是,==现有索引只有在关闭并且与快照中的索引具有相同数量的分片时才能恢复==。恢复操作会在已关闭的情况下自动打开已恢复的索引,如果集群中不存在则创建新的索引。如果使用 include_global_state(默认为 false)恢复集群状态,则添加集群中当前不存在的恢复模板,并使用恢复的模板替换现有的同名模板。恢复的持久设置将添加到现有的持久设置中。

1)关闭索引

1
http://20.5.2.68:9201/<索引名称>/_close

2)快照恢复

1
2
3
4
5
6
POST   http://20.5.2.68:9201/_snapshot/my_backup/snapshot_1/_restore
{
"indices": "index_1,index_2", // 选填,不填的话,则恢复所有已快照的索引
"ignore_unavailable": true, // 选填,将其设置为 true 将导致在快照创建期间忽略不存在的索引。默认为false,缺少索引时,快照请求将失败。
"include_global_state": true, // 恢复集群全局状态,包括索引模板等。默认是false
}

3)快照恢复过程的监控

1
GET   http://20.5.2.68:9201/_recovery?active_only=true

参考资料:https://blog.csdn.net/likui1314159/article/details/42920413

https://www.elastic.co/guide/en/elasticsearch/reference/5.6/indices-recovery.html

9、删除快照

1
curl -X DELETE http://20.5.2.68:9201/_snapshot/<快照库>/<快照名>

删除快照操作可用于取消长时间运行的快照操作,当然,这个快照也被删除了。经过测试,由该快照恢复完成的数据,在快照删除后,并不会发生变化。

从存储库中删除快照时,Elasticsearch 会删除==与已删除快照关联且未被任何其他快照使用的所有文件==。

10、参考资料

更为详细的资料可参考官方文档:

https://www.elastic.co/guide/en/elasticsearch/reference/5.6/modules-snapshots.html

https://elasticsearch.cn/article/648

https://cloud.tencent.com/developer/article/1438038